package com.huangsm.book.designmodel.string;

import java.util.LinkedList;
import java.util.Vector;

/**
 * 分别说明String、StringBuffer、StringBuilder的异同
 * @author huang
 * @PACKAGE_NAME com.huangsm.book.designmodel.string
 * @PROJECT_NAME concurrence
 * @date 2019/2/15
 */
public class StringAdd {
    public static void main(String[] args) {
        //1.使用字符串拼接会有如下问题，因为String是不可变的，因此每次累加都会重新生成新的对象，因此程序的性能大大降低。
        String result="ab"+"ac"+"d";

        //2.StringBuilder
        /**
         * 该代码只生成一个实例result1，并通过StringBuilder的append()方法向其中追加字符串
         */
        StringBuilder result1=new StringBuilder();
        result1.append("ab");
        result1.append("ac");
        result1.append("d");
        //但是实际发现2得效率却远不于1的
        //**结论:对于静态字符串的连接操作，Java在编译时会进行彻底的优化，将多个连接操作的字符串在编译时合并成一个单独的长字符串
        //二.String变量的累加操作 Java在编译时，就会对字符串进行一定的优化。
        String a="a";
        String b="a";
        String c="a";
        String d="a";
        String add=a+b+c+d;
        //即使如此在一些特殊场景下StringBuffer和StringBuilder仍然效率远远高于String，因此推荐使用这俩种

        //三.StringBuilder和StringBuffer的选择
        /**
         * 它们都实现了AbstractStringBuilder抽象类，拥有几乎相同的对外接口，两者的最大不同在于
         * StringBuffer对几乎所有的方法都做了同步，而StringBuilder并没有做任何同步。
         * 由于方法同步需要消耗一定的系统资源，因此，StringBuilder的效率也好于StringBuffer。但是在
         * 多线程系统中，StringBuilder无法保证线程安全，不能使用
         * 在使用时最好能指定他俩的容量，可以大大提高效率
         */

    }
}
